﻿#define _CRT_SECURE_NO_WARNINGS

//#include <stdio.h>
//int main()
//{
//	printf("haha\n");
//	main();
//	return 0;
//}

//1.求n的阶乘(递归）
//#include <stdio.h>
//int fact(int n)
//{
//	if (n == 0)
//	{
//		return 1;
//	}
//	else
//	{
//		return n * fact(n - 1);
//	}
//}
//int main()
//{
//	printf("请输入一个数:");
//	int input = 0;
//	scanf("%d", &input);
//	int a = fact(input);
//	printf("%d\n", a);
//	return 0;
//}

//2.顺序打印一个整数的每一位（递归）
//#include <stdio.h>
//void Print(int n)
//{
//	if (n / 10 == 0)
//	{
//		printf("%d ", n);
//	}
//	else
//	{
//		Print(n / 10);
//		printf("%d ", n % 10);
//	}
//}
//int main()
//{
//	printf("请输入一个整数：");
//	int input = 0;
//	scanf("%d", &input);
//	Print(input);
//
//	return 0;
//}

//3.求n的阶乘（非递归）
//#include <stdio.h>
//int fact(int n)
//{
//	int count = 1;
//	int i = 0;
//	for (i = 1; i <= n; i++)
//	{
//		count *= i;
//	}
//	return count;
//}
//int main()
//{
//	printf("请输入一个数:");
//	int input = 0;
//	scanf("%d", &input);
//	int a = fact(input);
//	printf("%d\n", a);
//	return 0;
//}

//4.求斐波那契数列（递归）
//#include <stdio.h>
//int fib(int n)
//{
//	if (n == 1 || n == 2)
//	{
//		return 1;
//	}
//	else
//	{
//		return fib(n - 1) + fib(n - 2);
//	}
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int a = fib(n);
//	printf("%d", a);
//	return 0;
//}

//5.求斐波那契数列（非递归）

//#include <stdio.h>
//int fib(int n)
//{
//	int a = 1;
//	int b = 1;
//	int i = 0;
//	int sum = 0;
//	for (i = 2; i < n; i++)
//	{
//		sum = a + b;
//		a = b;
//		b = sum;
//	}
//	return sum;
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int a = fib(n);
//	printf("%d", a);
//
//	return 0;
//}

//6.不能创建临时变量（第三个变量），实现两个整数的交换。
//#include <stdio.h>
//int main()
//{
//	int a = 1;
//	int b = 2;
//	printf("交换前 a=%d b=%d\n", a, b);
//	a = a ^ b;
//	b = a ^ b;
//	a = a ^ b;
//	printf("交换后 a=%d b=%d\n", a, b);
//	return 0;
//}

//7.求⼀个整数存储在内存中的二进制中1的个数。
//方法一
//#include <stdio.h>
//int main()
//{
//	int n = 0;
//	int count = 0;
//	scanf("%d", &n);
//	while (n != 0)
//	{
//		if ((n % 2) == 1)
//		{
//			count++;
//		}
//		n /= 2;
//	}
//	printf("二进制中1的个数为:%d\n", count);
//	return 0;
//}

//方法二 不改变n的值
//#include <stdio.h>
//int count(int n)
//{
//	int amount = 0;
//	int i = 0;
//	for (i = 0; i < 32; i++)
//	{
//		if ((n & 1) == 1)
//		{
//			amount++;
//		}
//		n >>= 1;
//	}
//	return amount;
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int a = count(n);
//	printf("二进制中1的个数为:%d\n", a);
//	return 0;
//}

//方法二副本 改变n的值
//#include <stdio.h>
//int count(int n)
//{
//	int amount = 0;
//	int i = 0;
//	for (i = 0; i < 32; i++)
//	{
//		if (((n >> i) & 1) == 1)
//		{
//			amount++;
//		}
//	}
//	return amount;
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int a = count(n);
//	printf("二进制中1的个数为:%d\n", a);
//	return 0;
//}

//方法三：
//#include <stdio.h>
//int main()
//{
//    int n = 0;
//    int count = 0;
//    scanf("%d", &n);
//    while (n)
//    {
//        n = n & (n - 1);
//        count++;
//    }
//    printf("二进制中1的个数为:%d\n", count);
//    return 0;
//}